/*
 * 这个文件使用 minio 库
 *     - 读取系统环境变量的操作放在 util 里当成工具才行
 *     - 数据库连接设置为 连接池(不知道可不可行) 并 支持心跳包
 *     - 对外暴露:
 *         1. presignedPutObject     获取文件上传的预签名URL
 *         2. presignedGetObject     获取文件下载的预签名URL
 */


const minio = require('minio');

// 读取连接 minio 的配置
const config = require('../util/server_config');
const { endPoint, port, useSSL, accessKey, secretKey } = config.minio;

const minioClient = {
    initMinIO,
    minio: null,
    getUploadUrl,
    getDownloadUrl
};

function initMinIO() {
    // 限制 minioClient.minio 只初始化一次
    if (minioClient.minio) { return };
    return new Promise((resolve, reject) => {
        try {
            console.log('正在连接 MinIO OSS 服务 ...', endPoint, port);
            // MinIO服务器配置
            minioClient.minio = new minio.Client({
                endPoint: endPoint,            // MinIO服务器地址
                port: parseInt(port),          // MinIO服务器端口
                useSSL: JSON.parse(useSSL),    // 是否使用SSL
                accessKey: accessKey,          // Access Key
                secretKey: secretKey           // Secret Key
            });
            // 使用 listBuckets 方法检测连接是否成功
            minioClient.minio.listBuckets((err, result) => {
                if (err) {
                    console.error('OSS 服务 连接失败 ! ! !');
                    console.error(err);
                    reject("OSS 服务 连接失败 ! ! ! !");
                    process.exit(1);
                } else {
                    console.log('OSS 服务 连接成功 ! ! !');
                    resolve("OSS 服务 连接成功 ! ! ! !");
                }
            });
        } catch (e) {
            console.error('OSS 服务 连接失败');
            console.error(e);
            reject("OSS 服务 连接失败 ! ! ! !");
            process.exit(1);
        }
    });
}

/*
 * 获取预签名URL
 * 用于上传单个文件
 */
function getUploadUrl(bucketName, objectName, expires) {
    return new Promise((resolve, reject) => {
        minioClient.presignedPutObject(bucketName, objectName, expires, function(err, presignedUrl) {
            if (err) {
                reject({ success: false, err });
                return;
            }
            resolve({ success: true, url: presignedUrl });
        });
    });
}

/*
 * 获取预签名URL
 * 用于下载单个文件
 */
function getDownloadUrl(bucketName, objectName, expires) {
    return new Promise((resolve, reject) => {
        minioClient.minio.presignedGetObject(bucketName, objectName, expires, function(err, presignedUrl) {
            if (err) {
                reject({ success: false, err });
                return;
            }
            resolve({ success: true, url: presignedUrl });
        });
    });
}


module.exports = minioClient;
